package org.Yiran.timetale_re.item.material;

import net.minecraft.world.item.Tier;
import net.minecraft.world.item.crafting.Ingredient;
import org.jetbrains.annotations.NotNull;

import java.util.function.Supplier;

/**
 * 工具材料类
 * <p>
 * 该类实现了Minecraft的Tier接口，用于定义工具材料的属性。
 * 使用record类型简化代码结构，包含工具材料的所有必要属性。
 * </p>
 */
public record ToolMaterial(
        // ============================== 材料属性字段 ==============================
        
        /*
          挖掘等级
          决定工具可以挖掘的方块类型
         */
        int miningLevel,
        
        /*
          物品耐久度
          工具在损坏前可以使用的次数
         */
        int itemDurability,
        
        /*
          挖掘速度
          工具挖掘方块的速度
         */
        float miningSpeed,
        
        /*
          攻击伤害加成
          工具作为武器时的额外攻击伤害
         */
        float attackDamage,
        
        /*
          附魔值
          影响工具可以获得的附魔等级
         */
        int merchantability,
        
        /*
          修复材料供应器
          提供用于修复工具的材料
         */
        Supplier<Ingredient> repairIngredient
) implements Tier {

    // ============================== Tier接口实现方法 ==============================
    
    /**
     * 获取工具的使用次数（耐久度）
     * 
     * @return 工具的耐久度
     */
    @Override
    public int getUses() {
        return this.itemDurability;
    }

    /**
     * 获取工具的挖掘速度
     * 
     * @return 工具的挖掘速度
     */
    @Override
    public float getSpeed() {
        return this.miningSpeed;
    }

    /**
     * 获取工具的攻击伤害加成
     * 
     * @return 工具的攻击伤害加成
     */
    @Override
    public float getAttackDamageBonus() {
        return this.attackDamage;
    }

    /**
     * 获取工具的挖掘等级
     * 
     * @return 工具的挖掘等级
     */
    @Override
    public int getLevel() {
        return this.miningLevel;
    }

    /**
     * 获取工具的附魔值
     * 
     * @return 工具的附魔值
     */
    @Override
    public int getEnchantmentValue() {
        return this.merchantability;
    }

    /**
     * 获取工具的修复材料
     * 
     * @return 用于修复工具的材料
     */
    @Override
    public @NotNull Ingredient getRepairIngredient() {
        return this.repairIngredient.get();
    }
}